import SwiftUI
import Combine

class CartViewModel: ObservableObject {
    @Published var validCartItems: [CartItem] = []
    @Published var invalidCartItems: [CartItem] = []
    @Published var recommendedProducts: [Product] = []
    @Published var isEditing: Bool = false
    @Published var selectedItems: Set<Int> = []
    @Published var showingSpecSelection: Bool = false
    @Published var itemForSpecSelection: CartItem?
    
    var totalSelectedPrice: Double {
        var total: Double = 0
        for item in validCartItems {
            if selectedItems.contains(item.id) {
                total += (item.productInfo?.price ?? 0) * Double(item.cartNum)
            }
        }
        return total
    }
    
    var selectedItemsCount: Int {
        return selectedItems.count
    }
    
    func loadCartItems() async {
        do {
            let apiService = APIService.shared
            let response = try await apiService.fetchCartList()
            
            if response.status == 200 {
                if let cartItems = response.data {
                    // 在主线程更新UI
                    DispatchQueue.main.async {
                        // 区分有效和无效商品
                        self.validCartItems = cartItems.filter { $0.productInfo != nil }
                        self.invalidCartItems = cartItems.filter { $0.productInfo == nil }
                        // 默认全选所有有效商品
                        self.selectedItems = Set(self.validCartItems.map { $0.id })
                    }
                } else {
                    DispatchQueue.main.async {
                        self.validCartItems = []
                        self.invalidCartItems = []
                    }
                }
            } else {
                print("Failed to load cart items: \(response.message ?? "Unknown error")")
            }
        } catch {
            print("Error loading cart items: \(error)")
        }
    }
    
    func loadRecommendedProducts() async {
        do {
            let apiService = APIService.shared
            let response = try await apiService.fetchRecommendProducts()
            
            if response.code == 200 {
                DispatchQueue.main.async {
                    self.recommendedProducts = response.data?.list ?? []
                }
            } else {
                print("Failed to load recommended products: \(response.message ?? "Unknown error")")
                DispatchQueue.main.async {
                    self.recommendedProducts = []
                }
            }
        } catch {
            print("Error loading recommended products: \(error)")
        }
    }
    
    // 判断商品是否被选中
    func isItemSelected(_ item: CartItem) -> Bool {
        return selectedItems.contains(item.id)
    }
    
    // 切换商品选中状态
    func toggleItemSelection(_ item: CartItem) {
        if selectedItems.contains(item.id) {
            selectedItems.remove(item.id)
        } else {
            selectedItems.insert(item.id)
        }
    }
    
    // 全选/取消全选
    func toggleAllSelection(_ isSelected: Bool) {
        if isSelected {
            // 全选
            selectedItems = Set(validCartItems.map { $0.id })
        } else {
            // 取消全选
            selectedItems.removeAll()
        }
    }
    
    // 更新商品数量
    func updateItemQuantity(_ item: CartItem, newQuantity: Int) {
        if let index = validCartItems.firstIndex(where: { $0.id == item.id }) {
            validCartItems[index].cartNum = newQuantity
        }
    }
    
    // 显示规格选择弹窗
    func showSpecSelection(for item: CartItem) {
        itemForSpecSelection = item
        showingSpecSelection = true
    }
    
    // 更新商品规格
    func updateItemSpec(_ item: CartItem, newSpec: String) {
        if let index = validCartItems.firstIndex(where: { $0.id == item.id }) {
            // 由于无法直接修改 productInfo.spec，我们需要使用其他方法
            // 例如，可以通过API调用来更新购物车项的规格
            print("更新商品规格为: \(newSpec)")
            
            // 这里应该调用API来更新购物车项
            // 例如: apiService.updateCartItemSpec(itemId: item.id, newSpec: newSpec)
            
            // 然后重新加载购物车数据
            Task {
                await loadCartItems()
            }
        }
    }
    
    // 删除选中的商品
    func deleteSelectedItems() {
        validCartItems.removeAll(where: { selectedItems.contains($0.id) })
        selectedItems.removeAll()
    }
    
    // 将选中的商品添加到收藏夹
    func addSelectedItemsToFavorites() {
        // 在实际应用中，这里应该调用API将商品添加到收藏夹
        // 然后从购物车中删除
        deleteSelectedItems()
    }
    
    // 清空无效商品
    func clearInvalidItems() {
        invalidCartItems.removeAll()
    }
    
    // 结算
    func proceedToCheckout() {
        // 在实际应用中，这里应该跳转到结算页面
        print("结算: \(selectedItems.count) 件商品，总价: \(totalSelectedPrice)")
    }
}
